package com.xinqi.modules.course.clazz.service;

import com.xinqi.common.base.response.PageInfo;
import com.xinqi.common.base.response.Param;
import com.xinqi.modules.course.clazz.domain.ClassGroupEntity;
import com.xinqi.modules.course.clazz.dto.req.*;
import com.xinqi.modules.course.clazz.dto.rsp.ClassGroupResultDTO;

import java.util.List;

/**
 * 班级分组表服务层
 *
 * @author: system
 * @date: 2023/01/17
 */
public interface ClassGroupService {
    /**
     * 分页查询 班级分组表数据
     */
    PageInfo<ClassGroupResultDTO> page(Param pageable, ClassGroupQueryDTO query);

    /**
     * 根据父分组查询子小组及小组下的人数
     *
     * @param pid
     * @return
     */
    List<ClassGroupResultDTO> findChildrenListByPid(Long pid);

    /**
     * 查询 班级分组表数据
     */
    List<ClassGroupResultDTO> find(ClassGroupQueryDTO query);

    /**
     * 根据id查询 班级分组表数据
     */
    ClassGroupResultDTO findById(Long id);

    /**
     * 获取子分组的数量，由于可以手动设置子分组数量，所以这个数字必须是查询而来
     *
     * @param classId 班级id
     * @param pid     父分组id
     * @return
     */
    Long findChildrenGroupNum(Long classId, Long pid);

    /**
     * 新增 班级分组表数据
     */
    Long insert(ClassGroupCreateDTO dto);

    /**
     * 应安卓端要求返回的这个东西
     *
     * @param dto
     * @return
     */
    ClassGroupResultDTO insertApp(ClassGroupCreateDTO dto);

    /**
     * 根据id修改 班级分组表数据
     */
    Boolean updateById(ClassGroupUpdateDTO dto);

    /**
     * 根据id删除 班级分组表数据
     */
    Boolean deleteById(Long id);

    /**
     * 根据id删除 班级分组表数据
     */
    Boolean deleteById(ClassGroupDeleteDTO dto);

    Boolean isExistsByName(Long classId, Long pid, String groupName, Long id);

    Boolean remove(Long id);

    ClassGroupResultDTO findOne(ClassGroupQueryDTO query);

    List<ClassGroupResultDTO> findListByPid(Long id);

    /**
     * 根据子分组id查询父分组信息
     *
     * @param id 子分组id
     * @return
     */
    ClassGroupEntity findParentById(Long id);

    Long teacherGrouping(ClassGroupCreateDTO dto);

    Long studentFreeGrouping(ClassGroupCreateDTO dto);

    List<ClassGroupResultDTO> findTree(ClassGroupQueryDTO dto);

    ClassGroupResultDTO findByGroupStudentId(Long stuId);

    ClassGroupResultDTO findByPidAndSign(ClassGroupSignQueryDTO dto);

    PageInfo<ClassGroupResultDTO> subChildrenPageList(Param pageable, ClassGroupQueryDTO dto);

    ClassGroupResultDTO findDetailById(Long id);

    List<ClassGroupResultDTO> findListByClassId(Long classId);

    /**
     * 根据班级id和类型查询班级下的大分组数量
     *
     * @param classId 班级id
     * @param type    分组类型
     * @return Integer
     */
    Long findParentGroupCountByClassId(Long classId, String type);

    Long findParentGroupCountByClassIdAndTypes(Long classId, List<String> types);

    List<ClassGroupResultDTO> findListByGroupStudentIds(List<Long> idList);

    List<ClassGroupEntity> findByClassIdList(List<Long> classIdList);

    void removeBatchByIds(List<Long> groupIds);

    void transferCourseClassGroupList(Long newCourseId, List<ClassGroupEntity> classGroupList);

    List<ClassGroupEntity> getByGroupIds(List<Long> groupIds);
}
